#ifndef __T_LISTAMENSAJES__
#define __T_LISTAMENSAJES__

/**
 * Una TListaMensajes es una lista simple que solo recibe
 * elementos del tipo TMensaje y los guarda ordenados por puerto y por prioridad.
 */

#define TLM_OK 0
#define TLM_ERR_MEMORIA 1
#define TLM_ERR_SINMENSAJES 2
#define TLM_NOMASMENSAJES 3

#include "TElemListaMensajes.h"
#include "TListaSimple.h"
#include "TMovimiento.h"

typedef struct {
	int tam_dato;
	TListaSimple* lista_simple;
} TListaMensajes;

/**
 * Crea una ListaMensajes
 * @param TListaMensajes* lista es la lista a crear
 * @autor
 * @pre   lista tiene memoria alocada suficiente
 * @post  lista es una ListaMensajes creada y lista para usar
 */
int LM_Crear(TListaMensajes* lista);

/**
 * Destruye una ListaMensajes
 * @param TListaMensajes* lista es una ListaMensajes creada
 * @autor
 * @pre   lista esta creada
 * @post  lista esta destruida
 */
int LM_Destruir(TListaMensajes* lista);

/**
 * Inserta un mensaje en la lista ordenado por puerto y por prioridad
 * @param TListaMensajes* lista es una ListaMensajes donde se va a insertar el mensaje
 * @param TMensaje* mensaje es el mensaje a insertar
 * @autor
 * @pre   lista y mensaje deben estar creados
 * @post  mensaje insertado en lista ordenado por puerto y prioridad
 */
int LM_InsertarMensaje(TListaMensajes* lista, TMensaje* mensaje);

/**
 * Saca el primer mensaje de la lista que tenga el puerto puerto y la prioridad de es_prioritario
 * @param TListaMensajes* lista es una ListaMensajes de donde se obtendra el mensaje
 * @param TPuerto puerto es el TPuerto de donde se quiere obtener el mensaje
 * @param TTipoMensaje es_prioritario es PRIORITARIO (0) o NO_PRIORITARIO (1)
 * @param TMensaje* mensaje_out es la variable donde se guardara el mensaje obtenido
 * @autor
 * @pre   lista, puerto y es_prioritario son instancias validas de cada TDA
 					y mensaje_out tiene memoria suficiente para almacenar el mensaje saliente
 * @post mensaje_out tiene el mensaje que se obtuvo y retorna TLM_OK; si no habia mensajes en ese puerto,
         mensaje_out no se altera y retorna TLM_ERR_SINMENSAJES.
 */
int LM_ObtenerMensaje(TListaMensajes* lista, TPuerto puerto, TTipoMensaje es_prioritario, TMensaje* mensaje_out);

#endif
